package com.itfenghuang.day11;

import java.io.*;

public class A05_多线程方式区别 {
//这三种方式的区别
/**
 *    1.实现 Rnmmable,Collable接口
 *       扩展性强,在实现接口的同时还可以继承其他的类
 *       编程相对复杂,不能直接使用 Thread 类中的方法
 *    继承Thread类
 *       编程简单,可以直接使用Thread 类中的方法
 *       扩展性差,不能继承其他的类
 *
 *    2.设置和获取线程名称
 *       public final String getname() 返回此线程的名称
 *       public final void setName(String name)将此线程的名称更改为等于参数name
 *       public static Thread currentThread()  获取当前正在执行的线程对象的引用
 *
 *    3.线程休眠
 *      public static void sleep(long mills)
 *      mills: 以毫秒为单位的睡眠时间长度
 *
 *    4.线程优先级
 *      线程调度: 系统给线程分配cpu的执行权
 *          两种:
 *              分时调度模式:
 *                  平均分配每个线程占用cpu的时间片
 *              抢占式调度模式:
 *                  随机分配pcu的使用权给每个线程
 *                  优先级高的,抢到cpu的shiyongquan概率高一些
 *   java 使用的是抢占式调度
 *      public final void setPriority(int newPriority) 更改此线程的优先级
 *      public final void getPriority() 返回此线程的优先级
 *      线程的优先级: 1-10  10:表示最高级   1:表示最低级  ,默认5
 *
 *    线程安全问题,死锁,等待唤醒机制,线程的生命周期,线程池
 *
 *    总结:
 *         第一步: 会用
 *              创建多线程三种方式, 这三种方式区别
 *         获取和修改线程名称  currentThread()  在不同地方调用这个方法,获取到的
 *              线程对象有什么不同
 *          线程休眠: sleep(long)
 *          线程的优先级:  prioity set和get
 *          java中的多线程是一种抢占式调度
 *
 *
 *
 *
 */
    public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
        MyRunnablea my = new MyRunnablea();
        //创建Thread 对象
        Thread the = new Thread(my);
        System.out.println(the.getName());
        the.setName("起飞咯");
        System.out.println(the.getName());
//        //开启线程
        the.start();
        //获取当前线程对象  main 主线程
        Thread thread3 = Thread.currentThread();
        //获取线程对象的名称
        System.out.println(thread3.getName());

        for (int i = 0; i < 5; i++) {
            //使当前正在运行的线程休眠  休眠了1秒 然后继续执行线程任务
            Thread.sleep(1000);
            System.out.println("天鹅");
        }


//        new Thread(new MyRunnablea()).start();
        Thread thread = new Thread(new MyRunnablea());
        thread.start();
        //主方法中的代码都是主线程的线程任务
        //这里是主线程休眠
//        Thread.sleep(1000);

        //获取线程优先级
        System.out.println(thread.getPriority());
        //获取主线程的优先级
        // 1.获取主线程对象
        Thread thread1 = Thread.currentThread();
        thread1.setPriority(1);
        System.out.println(thread1.getPriority());


    }
}

class MyRunnablea implements Runnable  {
    @Override
    public void run() {
        for (int i = 0; i < 20; i++) {
//            try {
//                Thread.sleep(1000);
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
            System.out.println("线程正在执行任务"+i);
        }
        //获取当前线程对象名称
        System.out.println(Thread.currentThread().getName());
    }
}
